home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI SNMP Access to HP-UX MIB 1.1.2
/
SGI SNMP Access to HP-UX MIB 1.1.2.iso
/
dist
/
pcp_eoe.idb
/
var
/
pcp
/
pmns
/
Rebuild.z
/
Rebuild
Wrap
Text File
|
1998-04-24
|
11KB
|
514 lines
#!/bin/sh
#
# Copyright 1997, Silicon Graphics, Inc.
# ALL RIGHTS RESERVED
#
# UNPUBLISHED -- Rights reserved under the copyright laws of the United
# States. Use of a copyright notice is precautionary only and does not
# imply publication or disclosure.
#
# U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND:
# Use, duplication or disclosure by the Government is subject to restrictions
# as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights
# in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or
# in similar or successor clauses in the FAR, or the DOD or NASA FAR
# Supplement. Contractor/manufacturer is Silicon Graphics, Inc.,
# 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311.
#
# THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY
# INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION,
# DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY
# PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON
# GRAPHICS, INC.
#Tag 0x00010D13
#
# Rebuild the binary PMNS, handling assorted errors
#
# $Id: Rebuild,v 2.45 1998/02/23 17:29:40 kenmcd Exp $
# Note. has to be run from where the PMNS files are installed, as
# pmnscomp uses dirname <root> as first in search path for #include
# Some degree of paranoia here ...
PATH=/usr/sbin:/usr/bsd:/sbin:/usr/bin:/bin:/usr/pcp/bin
export PATH
tmp=./$$
status=1
rm -f $tmp.*
trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15
_trace()
{
if $silent
then
:
else
if $nochanges
then
echo "$*"
else
echo "$*" >>$tmp.trace
fi
fi
}
_syslog()
{
logger -p user.alert -t PCP "$*"
_trace "$*"
}
_die()
{
[ -f $tmp.trace ] && cat $tmp.trace
exit
}
prog=`basename $0`
debug=false
nochanges=false
root=root
root_updated=false
update=false
verbose=""
dupok=""
silent=false
_usage()
{
_trace "Usage: Rebuild [-dnuv]"
_trace "Options:"
_trace " -d allow duplicate PMIDs in the PMNS"
_trace " -n dry run, show me what would be done"
_trace " -s silent, exit status says it all"
_trace " -u once only upgrade processing for a new PCP version"
_trace " -v verbose, for the paranoid"
}
# Fixup "root" after PCP upgrade
#
_upgrade_root()
{
[ ! -f root ] && return
_trace "Rebuild: PCP upgrade processing for \"root\" PMNS changes ..."
# Exclude all deprecated PMNS include files
# and metrics from pcp1.2 and earlier.
#
# Only metrics and include files for add-on
# products will remain (except webmeter).
#
$nochanges && _trace "+ cull irix names from PMNS ... <root >$tmp.root"
nawk <root >$tmp.root '
BEGIN { # exclude these ones from the top-level names
#
exc = "irix hinv hw pmcd proc hpux hpuxhinv"
n = split(exc, e)
for (i=1; i <= n; i++) {
not_in_root[e[i]] = 1
}
# do not #include any of these
#
no_inc = "kernel percpu disk memory swap network resource rpc nfs" \
" filesys ipc xfs engr proc pmcd hw irix-root irix-pmns"
n = split(no_inc, f)
for (i=1; i <= n; i++) {
not_included["\"" f[i] "\""] = 1
}
in_root = 0
skip = 0
}
$1 == "root" && $2 == "\{" { in_root = 1 }
in_root && $1 == "\}" { in_root = 0 }
$1 == "\#include" { if ($2 in not_included) next }
in_root { if ($1 in not_in_root) next }
/^irix[ .]/ && $2 == "\{" { skip = 1; next }
/^hinv[ .]/ && $2 == "\{" { skip = 1; next }
/^hw[ .]/ && $2 == "\{" { skip = 1; next }
/^pmcd[ .]/ && $2 == "\{" { skip = 1; next }
/^proc[ .]/ && $2 == "\{" { skip = 1; next }
/^hpux[ .]/ && $2 == "\{" { skip = 1; next }
/^hpuxhinv[ .]/ && $2 == "\{" { skip = 1; next }
skip && $1 == "\}" { skip = 0; next }
skip { next }
{ print }'
if cmp -s root $tmp.root >/dev/null 2>&1
then
# no changes ... already been here?
:
else
# we will usually end up here
root=$tmp.root
root_updated=true
fi
}
# Handle PCP versions prior to 1.2, and merge changes there into the new
# PMNS regime
#
_files_moved()
{
_trace "Rebuild: PCP upgrade processing for migrated PMNS files ..."
PMNS_OLD=${PMNS_OLD-/usr/pcp/pmns}
PMNS_NEW=${PMNS_NEW-/var/pcp/pmns}
# if you cannot write $PMNS_OLD, don't bother updating this directory
# ... required for diskless systems where /usr is read-only
#
if touch $PMNS_OLD/.check >/dev/null 2>&1
then
rm -f $PMNS_OLD/.check
OLD_RM="$RM"
OLD_MV="$MV"
else
OLD_RM=:
OLD_MV="$CP"
fi
# similar test for the parent of $PMNS_OLD
#
if touch `dirname $PMNS_OLD`/.check >/dev/null 2>&1
then
rm -f `dirname $PMNS_OLD`/.check
OLD_LN="$LN"
else
OLD_LN=:
fi
if [ -d $PMNS_NEW ]
then
# the new regime
if [ -l $PMNS_OLD ]
then
:
elif [ -d $PMNS_OLD ]
then
# PCP 1.2 fix-up
#
_trace "Relocating $PMNS_OLD files to $PMNS_NEW ..."
# pass 1, get the likely "active" files
#
for file in $PMNS_OLD/*
do
case $file
in
$tmp.*)
;;
$PMNS_OLD'/*'|*.O|*.N)
;;
*/Brand|*/Makefile|*/Rebuild)
eval $OLD_RM -f $file
;;
*)
base=`basename $file`
if [ -f $base ]
then
# file in both places
if diff -q $file $base >/dev/null
then
# no difference, easy option
eval $OLD_RM -f $file
else
# not the same file
if [ -f $base.N ]
then
# hard, old one becomes .O
eval $RM -f $base.O
eval $OLD_MV $file $base.O
else
# prefer old one, keep newie as .N
eval $MV $base $base.N
eval $OLD_MV $file $base
fi
fi
else
# not here, salvage from the other place
eval $OLD_MV $file $base
fi
;;
esac
done
# pass 2, deal with the leftovers
#
for file in $PMNS_OLD/*
do
case $file
in
$PMNS_OLD'/*')
;;
*)
base=`basename $file`
if [ ! -f $base ]
then
# copy across, no apparent conflict
eval $OLD_MV $file $base
else
# nuke the old one
eval $OLD_RM -f $file
fi
;;
esac
done
# cleanup
#
if [ "$PMNS_OLD" = "/usr/pcp/pmns" -a "$PMNS_NEW" = "/var/pcp/pmns" ]
then
# special case for PCP upgrades ...
#
eval $OLD_RM -rf $PMNS_OLD
eval $OLD_LN -s ../..$PMNS_NEW $PMNS_OLD
fi
elif [ -f $PMNS_OLD ]
then
# a file and not a dir not a symlink ... this is bad news
_syslog "$prog: \"$PMNS_OLD\" is neither a directory nor a symbolic link, cannot proceed"
_die
else
# does not exist, make symlink
eval $OLD_LN -s ../..$PMNS_NEW $PMNS_OLD
fi
fi
if [ "`echo *.N`" != "*.N" ]
then
_trace "Warning: the following new PMNS files may have to be merged ..."
_trace " `echo *.N`"
fi
}
while getopts dnusv\? c
do
case $c
in
d) dupok="-d"
;;
n) nochanges=true
echo "$prog: Warning: dry run, no changes will be made"
;;
u) update=true
;;
s) silent=true
;;
v) verbose="-v"
;;
\?) _usage
status=0
_die
;;
esac
done
shift `expr $OPTIND - 1`
# some preliminary checks
#
for file in /usr/pcp/lib/pmnsproc.sh /usr/pcp/bin/pmnsmerge /usr/pcp/bin/pmnscomp
do
if [ ! -x $file ]
then
_syslog "$prog: $file is missing. Cannot proceed."
_die
fi
done
. /usr/pcp/lib/pmnsproc.sh
if _can_load_ascii
then
:
else
# No license, nothing to do
#
$nochanges && _syslog "Warning: current PCP license does not allow PMNS updates"
status=0
_die
fi
here=`pwd`
_trace "Rebuilding the Performance Metrics Name Space (PMNS) in $here ..."
if [ $# -ne 0 ]
then
_usage
_die
fi
if $nochanges
then
CP="_trace + cp"
MV="_trace + mv"
LN="_trace + ln"
RM="_trace + rm"
PMNSMERGE="_trace + /usr/pcp/bin/pmnsmerge ..."
else
CP=cp
MV=mv
LN=ln
RM=rm
PMNSMERGE=
id=`id | sed -e 's/(.*//' -e 's/.*=//'`
if [ "X$id" != X0 ]
then
_syslog "$prog: script must be run as \"root\", cannot proceed"
_die
fi
fi
if $update
then
# PCP upgrade fix ups
#
_files_moved
_upgrade_root
fi
if [ -f $root ]
then
haveroot=true
else
haveroot=false
if $nochanges
then
_trace "+ create empty root PMNS ..."
else
root=$tmp.root
cat <<EOFEOF >$root
root {
}
EOFEOF
fi
fi
# Prior to Irix6.4 we did not ship any pmns files. To cater
# for this we now ship the Irix pmns as part of root_pcp.
#
# The 6.4 Irix ism ships irix-pmns and irix-root. So, if root_irix
# does not exist, we need to create it to include irix-pmns and
# irix-root in the right places.
#
# After Irix 6.4, we will just ship root_irix.
#
# NOTE This is here, and outside scope of -u processing because these
# changes may be needed by an IRIX upgrade after the PCP installation
# or upgrade
#
if [ -f irix-root -a -f irix-pmns -a ! -f root_irix ]
then
# Create root_irix
if $nochanges
then
_trace "+ creating root_irix ..."
else
cat << EOFEOF > root_irix
/*
* Irix PMNS for Irix 6.4
* frozen on 21 November 1996.
*/
#define _DATESTAMP 961121
root {
#include "irix-root"
}
#include "irix-pmns"
EOFEOF
fi
fi
# Merge $root and root_* to produce the new root.
# Each root_* file should be a complete namespace,
# i.e. it should include an entry for root.
# Some of these may be disabled with cpp conditional code.
#
mergelist=""
if [ "`echo root_*`" != "root_*" ]
then
mergelist=`ls -1 root_* | nawk '
/root_.*\.bin/ {next}
/root_web/ {next}
/root_.*\.[ON]/ {next}
{print}'`
fi
_trace "$prog: merging the following PMNS files: "
_trace $root $mergelist | fmt | sed -e 's/^/ /'
eval $RM -f $tmp.newroot
eval $PMNSMERGE
/usr/pcp/bin/pmnsmerge $verbose $dupok $root $mergelist $tmp.newroot >$tmp.out 2>&1
if [ $? != 0 -o ! -f $tmp.newroot.bin ]
then
cat $tmp.out
_syslog "$prog: /usr/pcp/bin/pmnsmerge failed"
_trace " \"root\" and \"root.bin\" have not been changed."
_die
fi
# Multiple Rebuilds in succession should be a no-op.
#
if [ -f root ]
then
cp root $tmp.tmp # cp to avoid any root.bin problems
pminfo -m -n $tmp.tmp 2>/dev/null | sort >$tmp.list.old
fi
if [ ! -s $tmp.list.old ]
then
cp $root $tmp.tmp # cp to avoid any root.bin problems
pminfo -m -n $tmp.tmp 2>/dev/null | sort >$tmp.list.old
fi
pminfo -m -n $tmp.newroot | sort >$tmp.list.new
if cmp -s $tmp.list.old $tmp.list.new > /dev/null 2>&1
then
[ ! -f root ] && eval $MV $tmp.newroot root
[ ! -f root.bin ] && eval $MV $tmp.newroot.bin root.bin
_trace "$prog: PMNS is unchanged."
else
# Install the new root
#
[ ! -z "$verbose" ] && cat $tmp.out
if $haveroot
then
_trace "$prog: PMNS \"$here/root\" updated."
_trace "... previous version saved as \"$here/root.prev\""
eval $MV root root.prev
else
_trace "$prog: new PMNS \"$here/root\" created."
fi
eval $MV $tmp.newroot root
eval $MV $tmp.newroot.bin root.bin
# signal pmcd if it is running
#
pminfo -v pmcd.version >/dev/null 2>&1 && killall -HUP pmcd
if [ ! -z "$verbose" ] && $haveroot
then
_trace "+ PMNS differences ..."
diff -c $tmp.list.old $tmp.list.new
_trace
_trace "+ root differences ..."
diff -c root.prev root
fi
fi
# remake stdpmid
#
[ -f Make.stdpmid ] && ./Make.stdpmid
[ X"$verbose" = X-v -a -f $tmp.trace ] && cat $tmp.trace
status=0
exit